package com.xiangge.demo;

import java.util.Arrays;
import java.util.Scanner;

public class DemoTest {
    public static void main(String[] args) {
        /*
        在编程竞赛中，有6个评委为参赛的选手打分，分数为0-100的整数分。
        选手的最后得分为：去掉一个最高分和一个最低分后 的4个评委平均值 (不考虑小数部分)。
*/
            // 有6位评委打分，将分数组成数组，评委打分使用循环实现
            // 定义长度为6的int类型数组
            int[] arr = new int[6];
            // 评委手动打分也就是键盘录入
            Scanner sc = new Scanner(System.in);
        getScore(arr, sc);
    }
    private static void getScore(int[] arr, Scanner sc) {
        // 使用for循环，将评委打分进行六次键盘录入
        for (int i = 0; i < 6; i++) {
            // 手动录入
            System.out.println("请第" + (i+1) + "位评委打分：");
            arr[i] = sc.nextInt();
            // 分数有范围，使用if单选结构做规范
            if (arr[i] < 0 || arr[i] > 100){
                System.err.println("分数超额");
                return;
            }
        }
        // 要去掉最高分和最低分，那就要再定义int类型变量，遍历数组进行比较
        // 假设数组的第一个元素就是最大值，最小值
        // 同时定位最大值，最小值的索引位置
        int max = arr[0];
        int maxIndex = 0;
        int min = arr[0];
        int minIndex = 0;
        // 遍历数组
        for (int i = 0; i < 6; i++) {
            // 使用if语句判断
            if (max < arr[i]){
                max = arr[i];
                maxIndex = i;
            }
            if (min > arr[i]){
                min = arr[i];
                minIndex = i;
            }
        }
        // 创建一个新数组，将arr数组排除最大值和最小值后的元素放入
        int[] newArr = new int[4];
        // 新数组的索引用index定义
        int index = 0;
        // 遍历arr数组，同时用if语句判断将元素放入
        loop:for (int i = 0; i < 6; i++) {
            if (i != maxIndex && i != minIndex){
                newArr[index] = arr[i];
                index++;
                // 再循环内进行index的条件判断
                if (index == 4){
                    break loop;
                }
            }
        }
        System.out.println(Arrays.toString(newArr));
        // 再遍历新数组，求新数组的和
        // 要求和先定义总分sum和平均分avg
        int sum = 0;
        int avg = 0;
        for (int i = 0; i < newArr.length; i++) {
            sum += newArr[i];
        }
        // 输出平均值sum / newArr.length --> sum / 4
        avg = sum / 4;
        System.out.println("选手的得分是：" + avg);
    }

    public static void mainChange(String[] args) {
        /*
        已知一个数组 arr = {17, 29, 34, 42, 51};
        用程序实现把数组中的元素值交换，
        交换后的数组 arr = {51, 42, 34, 29, 17};
        并在控制台输出交换后的数组元素。
*/
        // 定义已知数组
        int[] arr = {17, 29, 34, 42, 51};
        int[] temp1 = change(arr);
        // 最后使用Array工具查看数组
        System.out.println(Arrays.toString(arr));
    }
    private static int[] change(int[] arr) {
        // 创建一个临时变量用于进行数组元素的交换
        int temp= 0;
        // 遍历数组,同时建立两个指针，分别从前后一起遍历
        for (int i = 0, j = arr.length-1; i <= j; i++, j--) {
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        return arr;
    }

    public static void mainIndex(String[] args) {
        /*
        已知一个数组 arr = {17, 29, 34, 42, 51};
        键盘录入一个数据，查找该数据在数组中的索引。
        并在控制台输出找到的索引值。
        如果没有查找到，则输出-1
*/
        // 已知一个数组
        int[] arr = {17, 29, 34, 42, 51};
        // 键盘录入数据，在数组中查找
        System.out.println("输入想要查找的数据：");
        int num = new Scanner(System.in).nextInt();
        int index = getIndex(arr, num);
        System.out.println("查找的数据索引为：" + index);
    }
    private static int getIndex(int[] arr, int num) {
        // 定义想要查找的数据的索引为index
        int index = -1;
        // 遍历数组，将数组的元素与输入值对比
        for (int i = 0; i < arr.length; i++) {
            // 如果元素与输入值相同，则记录它的索引
            if (num == arr[i]){
                index = i;
                break;
            }else {
                System.err.println("查询数据错误");
                break;
            }
        }
        return index;
    }

    public static void mainCompare(String[] args) {
        /*
        定义一个方法，用于比较两个数组的内容是否相同
        分析：数组是否相同看
                    1.数组长度
                    2.遍历元素
        */
        // 定义两个数组
        int[] arr1 = {1, 2, 3, 4, 5};
        int[] arr2 = {1, 2, 3, 4, 5};
        // 先定义一个布尔值，假设这两个数组是相同的
        boolean flag = true;
        compare(arr1, arr2, flag);
    }
    private static void compare(int[] arr1, int[] arr2, boolean flag) {
        // 首先进行数组的长度比较
        if (arr1.length != arr2.length) {
            flag = false;
        }
        // 其次就是遍历一个数组，对数组里面的元素进行对比
        for (int i = 0; i < arr1.length; i++) {
                // if语句结构判断
                if (arr1[i] != arr2[i]) {
                    flag = false;
                    break;
                }
        }
        // 根据布尔值来判断数组是否一致
        if (flag == true) {
            System.out.println("数组一致");
        } else {
            System.out.println("数组不一致");
        }
    }

    public static void main6(String[] args) {
        /*
        有这样的一个数组，元素是{58,17,95,66,173,996,51,200}。
        求出该数组中满足要求的元素和，要求是：
        求和的元素个位和十位都不能是7，并且只能是偶数
*/
        // 定义已知数组
        int[] arr = {58, 17, 95, 66, 173, 996, 51, 200};
        int sum = 0;
        // 想要求出数组的和，需要对数组进行遍历
        for (int i = 0; i < arr.length; i++) {
            // 对于求和元素有相应的要求
            // 元素的个位(arr[i]%10)和十位(arr[i]/10%10)不能是7，且都是偶数
            // 定义布尔值变量，假设当前的arr[i]是符合要求的
            boolean flag = true;
            // 对单个数组进行操作不需要再遍历一次数组
            if (arr[i] % 10 == 7 || arr[i] / 10 % 10 == 7 || arr[i] % 2 != 0) {
                flag = false;
            }
            // 对累加值的类型进行判断
            if (flag == true) {
                sum += arr[i];
            }
        }
        System.out.println(sum);
    }

    public static void main5(String[] args) {
        /*
        我国古代数学家张丘建在《算经》一书中提出的数学问题：
        鸡翁一值钱五，鸡母一值钱三，鸡雏三值钱一。
        百钱买百鸡，问鸡翁、鸡母、鸡雏各几何？
        100买100只鸡，公鸡5块一只，母鸡3块一只，小鸡1块三只
        极限法：  全买公鸡----20
                全买母鸡----33
                全买小鸡----100(只买100只鸡，小鸡可以买300只，但不需要)
*/
        // 全买公鸡[0,20]  全买母鸡[0,33]  全买小鸡[0,100]
        // 公鸡数量i + 母鸡数量j + 小鸡数量k <= 100
        // i * 5 + j * 3 + k * (1 / 3) <= 100
        for (int i = 0; i <= 20; i++) {
            for (int j = 0; j <= 33; j++) {
                for (int k = 0; k <= 100; k++) {
                    if (i * 5 + j * 3 + k * (1 / 3) == 100 && i + j + k == 100) {
                        System.out.println("公鸡" + i + "只" + "\t" + "母鸡" + j + "只" + "\t" + "小鸡" + k + "只");
                    }
                }
            }
        }
    }

    public static void main4(String[] args) {
        /*有一对兔子，从出生后第3个月起每个月都生一对兔子，
        小兔子长到第三个月后每个月又生一对兔子，
        假如兔子都不死，问第二十个月的兔子对数为多少？
*/
        // 使用数组来实现，数组的长度代表月数，数组的元素代表当月兔子的数量
        int[] arr = new int[20];
        // 使用for循环遍历数组
        // 已经知道兔子在一开始是只有一对的,在出生三个月才开始生育
        arr[0] = 1;
        arr[1] = 1;
        // 兔子从第三个月开始增长，数组遍历从第三个月开始，即索引2
        for (int i = 2; i < arr.length; i++) {
            arr[i] = arr[i - 1] + arr[i - 2];
        }
        // 最后输出第二十个月的兔子数量
        System.out.println("第二十个月的兔子数量:" + arr[19]);
    }

    public static void main3(String[] args) {
        /*朋友聚会的时候可能会玩一个游戏：逢七过。
        规则是：从1开始报数，当你要报的数字包含7或者是7的倍数时都要说：过。
        为了帮助大家更好的玩这个游戏，这里我们直接在控制台打印出1-100之间的满足逢七必过规则的数据。
        这样，大家将来在玩游戏的时候，就知道哪些数据要说：过。
*/
        // 通过条件判断使用for循环语句
        // 在1-100之间
        for (int i = 1; i < 101; i++) {
            // 使用if语句结构判断条件
            if (i % 7 == 0 || i % 10 == 7 || i / 10 % 10 == 7) {
                System.out.print("过");
            }
            System.out.print(i + "\t");
        }
    }

    public static void main2(String[] args) {
        /*输入星期数，显示今天的减肥活动
          周一：跑步
          周二：打篮球
          周三：慢走
          周四：山地自行车
          周五：游泳
          周六：爬山
          周日：胡吃海喝一顿
*/
        // 同样的问题使用switch语句执行
        // 使用键盘输入星期，进行条件判断
        System.out.println("请输入星期几：");
        int input = new Scanner(System.in).nextInt();
        // 先使用if单选结构排除错误录入
        if (input < 1 || input > 7) {
            System.err.println("输入的星期数不合法！");
            return;
        }
        // 使用switch语句进行选择
        switch (input) {
            case 1:
                System.out.println("周一：跑步");
                break;
            case 2:
                System.out.println("周二：打篮球");
                break;
            case 3:
                System.out.println("周三：慢走");
                break;
            case 4:
                System.out.println("周四：山地自行车");
                break;
            case 5:
                System.out.println("周五：游泳");
                break;
            case 6:
                System.out.println("周六：爬山");
                break;
            case 7:
                System.out.println("周七：胡吃海喝一顿");
                break;
        }
    }

    public static void main1(String[] args) {
        /*输入星期数，显示今天的减肥活动
          周一：跑步
          周二：打篮球
          周三：慢走
          周四：山地自行车
          周五：游泳
          周六：爬山
          周日：胡吃海喝一顿
*/
        // 使用键盘输入星期，进行条件判断
        System.out.println("请输入星期几：");
        int input = new Scanner(System.in).nextInt();
        // 先使用if单选结构排除错误录入
        if (input < 1 || input > 7) {
            System.err.println("输入的星期数不合法！");
            return;
        }
        // 使用if多选结构的条件选择问题
        if (input == 1) {
            System.out.println("周一：跑步");
        } else if (input == 2) {
            System.out.println("周二：打篮球");
        } else if (input == 3) {
            System.out.println("周三：慢走");
        } else if (input == 4) {
            System.out.println("周四：山地自行车");
        } else if (input == 5) {
            System.out.println("周五：游泳");
        } else if (input == 6) {
            System.out.println("周六：爬山");
        } else {
            System.out.println("周七：胡吃海喝一顿");
        }
    }
}
